//
//  WBStatusViewModel.swift
//  shanshanlol微博
//
//  Created by 叶竞泽 on 2017/1/22.
//  Copyright © 2017年 JingZe. All rights reserved.
//

import Foundation

/// 单条微博的视图模型
class WBStatusViewModel: CustomStringConvertible {
    
    /// 微博模型
    var status: SSWBStatus
    
    /// 会员图标
    var memberIcon: UIImage?
    
    /// 认证类型, -1:没有认证,0:认证用户,2,3,5:企业认证,220:达人
    var vipIcon: UIImage?
    
    /// 转发数量文字
    var retweetStr: String?
    
    /// 评论文字
    var commentStr: String?
    
    /// 点赞文字
    var likeStr: String?
    
    /// 配图视图大小
    var picViewSize = CGSize()
    
    /// 时间字符串  - "Wed Feb 01 20:03:01 +0800 2017"
    var timeText: String?
    
    /// 来源字符串 - source = "<a href="http://app.weibo.com/t/feed/mpcaI" rel="nofollow">HUAWEI Mate 9</a>"    
    var sourceText: String?
    
    /// 如果是转发的微博配图,原创微博一定没有配图
    var picURLs: [SSWBStatusPic]? {
        // 如果有被转发的微博,返回被转发微博的配图
        // 如果没有被转发的微博,返回原创微博的配图
        // 如果都没有,返回nil
        return status.retweeted_status?.pic_urls ?? status.pic_urls
    }
    
    /// 微博正文的属性文本
    var statusAttrText: NSAttributedString?
    
    /// 被转发微博的文字
    var retweetAttrText: NSAttributedString?
    
    /// 行高
    var rowHeight: CGFloat = 0
    
    
    /// 构造函数
    ///
    /// - Parameter model: 微博模型
    /// - Return: 返回微博视图模型
    init(model: SSWBStatus) {
        
        self.status = model
        
        // common_icon_membership_level 1-6
        // 会员等级图标
        if (model.user?.mbrank)! > 0 && (model.user?.mbrank)! < 7 {
            let imageName = "common_icon_membership_level\(model.user!.mbrank)"
            memberIcon = UIImage(named: imageName)
        }
        
        // 认证图标
        var vipIconName = ""
        switch model.user?.verified_type ?? -1 {
        case 0:
            vipIconName = "avatar_vip"
        case 2,3,5:
            vipIconName = "avatar_enterprise_vip"
        case 220:
            vipIconName = "grassroot"
        default:
            vipIconName = ""
        }
        
        // 设置认证图标
        vipIcon = UIImage(named: vipIconName)
        
        // 设置底部计数字符串
        retweetStr = countStr(count: status.reposts_count, defaultString: "转发")
        commentStr = countStr(count: status.comments_count, defaultString: "评论")
        likeStr = countStr(count: status.attitudes_count, defaultString: "赞")

        // 计算配图视图大小
        picViewSize = calcPicViewSize(count: picURLs?.count)
        
        // 设置被转发微博的文字内容
        let originalFont = UIFont.systemFont(ofSize: 15)
        let retweetFont = UIFont.systemFont(ofSize: 14)
        
        // 设置微博正文文本
        statusAttrText = SSEmoticonManager.shared.emoticonString(string: model.text ?? "", font: originalFont)
        
        // 设置被转发微博文本
        let rText = "@" + (status.retweeted_status?.user?.screen_name ?? "") + ": " + (status.retweeted_status?.text ?? "")
        retweetAttrText = SSEmoticonManager.shared.emoticonString(string: rText, font: retweetFont)
        
        // 设置微博来源
        sourceText = "来自: " + (status.source?.ss_href()?.text ?? "")
        
        // 设置微博创建时间
        timeText = status.created_at
        
        // 计算行高
//        updateRowHeight()
    }
    
    /// 重写description
    var description: String {
        return status.yy_modelDescription()
    }
    
    /// 使用单个图像更新配图视图的大小
    ///
    /// - Parameter image: 缓存的单张图像
    func updateSingleImageSize(image: UIImage) {
        
        var size = image.size
        
        let maxWidth: CGFloat = 200
        let minWidth: CGFloat = 40
        
        // 过宽图像处理 
        if size.width > maxWidth {
            // 设置最大宽度
            size.width = maxWidth
            // 等比设置图像高度
            size.height = size.width * image.size.height / image.size.width
        }
        
        // 过窄图像处理
        if size.width < minWidth {
            // 设置最小宽度
            size.width = minWidth
            // 等比设置图像高度
            size.height = size.width * image.size.height / image.size.width / 4
        }
        
        if size.height > maxWidth {
            size.height = maxWidth
        }
        
        size.height += outterMargin
        
        // 重新设置配图视图大小
        picViewSize = size
        
        // 更新行高
//        updateRowHeight()
    }
    
    /// 根据当前视图模型内容计算行高
//    func updateRowHeight() {
//        
//        // 原创微博: 顶部分割12 + 间距12 + 头像高度34 + 间距12 + 正文高度:需要计算 + 配图视图高度:需要计算 + 间距12 + 底部视图高度35
//        // 转发微博: 顶部分割12 + 间距12 + 头像高度34 + 间距12 + 正文高度:需要计算 + 间距12 + 间距21 + 转发微博正文高度:需要计算 + 转发微博配图:需要计算 + 间距12 + 底部视图高度35
//        
//        let margin: CGFloat = 12
//        let iconHeight: CGFloat = 34
//        let toolBarHeight: CGFloat = 35
//        
//        var height: CGFloat = 0
//        
//        let size = CGSize(width: UIScreen.cz_screenWidth() - outterMargin * 2, height: CGFloat(MAXFLOAT))
//        
//        // 1.计算顶部位置
//        height = 3 * margin + iconHeight
//        
//        // 2.正文高度
//        if let text = statusAttrText {
//            /**
//             1.预期尺寸,宽度固定,高度尽量大
//             2.选项,换行文本,统一使用usesLineFragmentOrigin
//             3.attributes:指定字体字典
//             */
//            // 属性文本已经包含了字体属性
//            height += text.boundingRect(with: size, options: [.usesLineFragmentOrigin], context: nil).height
//        }
//        
//        // 3.判断是否转发微博
//        if status.retweeted_status != nil {
//            
//            height += 2 * margin
//            
//            // 转发文本的高度 - retweetText为拼接后的字符串,不能用原始字符串
//            if let text = retweetAttrText {
//                
//                height += text.boundingRect(with: size, options: [.usesLineFragmentOrigin], context: nil).height
//            }
//        }
//        
//        // 4.配图视图
//        height += picViewSize.height
//        height += margin
//        
//        // 5.底部工具栏
//        height += toolBarHeight
//        
//        // 6.使用属性记录
//        rowHeight = height
//    }
    
    /// 计算指定数量的图片对应的配图视图的大小
    ///
    /// - Parameter count: 图片数量
    /// - Returns: 配图视图大小
    private func calcPicViewSize(count: Int?) -> CGSize {
        
        if count == 0 || count == nil {
            return CGSize()
        }
        /// 根据count计算行数,图片数量1-9
        let row = (count! - 1) / 3 + 1
        
        /// 根据行数算高度
        var height = outterMargin
        height += CGFloat(row) * itemWidth + (CGFloat(row) - 1) * innerMargin
        
        return CGSize(width: viewWidth, height: height)
    }
 
    /// 给定一个数字,返回字符串描述
    ///
    /// - Parameters:
    ///   - count: 数字
    ///   - defaultString: 默认显示的字符串,转发/评论/赞
    /// - Returns: 描述结果
    private func countStr(count: Int, defaultString: String) -> String {
        if count == 0 {
            return defaultString
        }
        if count < 10000 {
            return count.description
        }
        return String(format: "%.02f万", Double(count) / 10000)
    }
}
